<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>05_Reflect-Reflect和Object区别之一</title>
  <!-- 
  在 JavaScript 中， `Reflect`  和  `Object`  都是用于处理对象的内置对象，但它们的功能和用途有所不同。
  1. 基本概念
  - Object：
    -  `Object`  是 JavaScript 的一个内置构造函数，用于创建对象和处理对象的基本操作。
    - 它提供了一系列静态方法，用于对象的创建、属性操作、原型管理等。

  - Reflect：
    -  `Reflect`  是一个内置对象，提供了一组静态方法，用于操作对象的基本操作，主要用于简化和改进对对象的操作。
    - 它的设计目的是为了提供一种更一致的方式来操作对象，特别是在使用  `Proxy`  时。

  2. 用法
  - Object：
    -  `Object`  提供的方法包括  `Object.create()` ,  `Object.keys()` ,  `Object.assign()` ,  `Object.freeze()`  等。
  const obj = { name: "Alice" };
  const keys = Object.keys(obj); // ['name']
  const newObj = Object.assign({}, obj); // { name: "Alice" }
  - Reflect：
    -  `Reflect`  提供的方法包括  `Reflect.get()` ,  `Reflect.set()` ,  `Reflect.has()` ,  `Reflect.deleteProperty()`  等，通常用于执行标准对象操作。
  const obj = { name: "Alice" };
  console.log(Reflect.get(obj, 'name')); // "Alice"
  Reflect.set(obj, 'age', 30); // 设置属性
  console.log(obj.age); // 30
  3. 主要区别

  | 特性               | Object                                   | Reflect                               |
  |--------------------|-----------------------------------------|---------------------------------------|
  | 定义               | 用于创建对象和处理对象的基本操作      | 提供静态方法，简化对象操作           |
  | 方法类型           | 提供多种方法来创建和操作对象          | 提供一组方法，主要用于标准操作       |
  | 语义               | 通常用于对象的创建和管理               | 更加一致和简洁，特别是在  `Proxy`  中 |
  | 返回值             | 许多方法返回  `undefined`  或新对象     | 大部分方法返回操作的结果（如布尔值） |

  4. 总结
  `Object`  和  `Reflect`  是 JavaScript 中处理对象的两个重要工具。 `Object`  用于创建和管理对象，而  `Reflect`  提供了一组方法来执行标准对象操作，旨在简化代码并提高可读性。理解它们之间的区别和用法，可以帮助开发者更有效地操作对象。
    -->
</head>
<body>

  <script>
    "use strict"
    const obj = {
      name: "张三",
      age: 18,
      get gender() {
        return "男"
      }
    }

    Object.defineProperty(obj, "name", {
      value: "张三",
      writable: false,
      configurable: false,
      enumerable: false
    })

    // 1. 用以前的方式进行操作
    delete obj.name
    if (!obj.name) {
      console.log("obj.name不存在");
    } else {
      console.log("obj.name存在");
    }

    // 2. 用Proxy的方式进行操作
    if (Reflect.deleteProperty(obj, "name")) {
      console.log("obj.name不存在");
    } else {
      console.log("obj.name存在");
    }


  </script>
  
</body>
</html>